/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.seguranca.vo.ModuloVO;
import br.uniceub.fsw.seguranca.dao.ModuloDAO;
import br.uniceub.fsw.indicadores.bo.DadoPrimarioBO;
import br.uniceub.fsw.indicadores.dao.DadoPrimarioDAO;
import br.uniceub.fsw.indicadores.vo.DadoPrimarioVO;
import br.uniceub.fsw.indicadores.dao.IndicadorDAO;
import br.uniceub.fsw.indicadores.vo.IndicadorVO;
import br.uniceub.fsw.util.TabelaHtml;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Facade da entidade Dado Primário.
 * 
 * @author Marcos Mello Nobrega Soares ra2013617/8
 */
public class DadoPrimarioFacade {
    /**
     * Mensagem de retorno do sistema.
     */
    private String message;

    /**
     * Value object do indicador do dado primário.
     */
    private IndicadorVO indicador;
    
    /**
     * Value object do dado primário
     */
    private DadoPrimarioVO dadoPrimario;
      
    /**
     * Lista de indicadores ativos
     */
    private List<List> indicadores;
    
    /**
     * Lista de módulos da fábrica
     */
    private List<List> modulos;
    
    /**
     * Construtor da classe.
     */
    public DadoPrimarioFacade() {
        this.indicadores = new ArrayList<List>();
        this.modulos = new ArrayList<List>();
        List<String> temp;
        int i;

        // indicadores ativos
        IndicadorVO indExemplo = new IndicadorVO();
        indExemplo.setStIndicadorAtivo("S");
        List<IndicadorVO> inds = new IndicadorDAO().consultarPorExemplo(indExemplo);
        
        // Módulos base
        List<ModuloVO> mods = new ModuloDAO().consultarPorModuloPaiOrdenadoPorNome(1);

        for(i = 0; i < inds.size(); i++) {
            temp = new ArrayList<String>();
            temp.add(inds.get(i).getIdIndicador().toString());
            temp.add(inds.get(i).getNoIndicador().toString());
            temp.add(inds.get(i).getDsIndicador().toString());
            temp.add(inds.get(i).getPeriodicidade().getDsPeriodicidade().toString());            
            temp.add(inds.get(i).getDimensao().getNoDimensao().toString());            
            this.indicadores.add(temp);
        }
        
        temp = new ArrayList<String>();
        temp.add("0");
        temp.add("Sem módulo - Dado Externo");
        this.modulos.add(temp);
        for(i = 0; i < mods.size(); i++) { 
            if(!mods.get(i).getDsModulo().toLowerCase().trim().equals("inicial") && !mods.get(i).getDsModulo().toLowerCase().trim().equals("efetuar login")) {
                temp = new ArrayList<String>();
                temp.add(mods.get(i).getIdModulo().toString());
                temp.add(mods.get(i).getDsModulo().toString());
                this.modulos.add(temp);
            }
        }
    }
    
    /**
     * Getter da mensagem de retorno.
     * 
     * @return Mensagem de retorno.
     */
    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.isEmpty()) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }
    
    /**
     * Retorna o indicador do dado primário.
     * 
     * @return Objeto indicador.
     */
    public IndicadorVO getIndicador() {
        return this.indicador;
    }
    
    /**
     * Retorna o dado primário.
     * 
     * @return Objeto dado primário.
     */
    public DadoPrimarioVO getDadoPrimario() {
        return this.dadoPrimario;
    }
    
    /**
     * Retorna os Indicadores ativos.
     * 
     * @return Lista de Indicadores ativos.
     */
    public List<List> getIndicadores() {
        return this.indicadores;
    }
    
    /**
     * Retorna os Módulos da Fábrica.
     * 
     * @return Lista de Indicadores ativos.
     */
    public List<List> getModulos() {
        return this.modulos;
    }
     
    /**
     * Responsável por executar a operação selecionada pelo usuário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");

        if(oper != null && oper.length() > 0)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);
            }
            if (oper.equals("incluir")) {
                this.incluir(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }
            if (oper.equals("excluir")) {
                this.excluir(req, resp);
            }
            if (oper.equals("confirmar")) {
                this.confirmar(req, resp);
            }
        }
        if(req.getParameter("idIndicador") != null && req.getParameter("idIndicador").length() > 0) {
            try {
                indicador = new IndicadorDAO().consultarPorId(Integer.parseInt(req.getParameter("idIndicador")));
            }
            catch (NumberFormatException e) {             
            }
        }
    }
    
    /**
     * Consultar um dado primário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        String idDadoPrimarioTmp = req.getParameter("idDadoPrimario");
        
        Integer idDadoPrimario = null;
        
        if(idDadoPrimarioTmp == null || idDadoPrimarioTmp.equals("")) {
            return;
        } else {
            idDadoPrimario = Integer.parseInt(idDadoPrimarioTmp);
        }
        
        dadoPrimario = new DadoPrimarioDAO().consultarPorId(idDadoPrimario);
    }

    /**
     * Incluir um dado primário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void incluir(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = "";
        int id;

        dadoPrimario = new DadoPrimarioVO();
        
        if(!req.getParameter("cdModulo").equals("")) {
            try {
                id = Integer.parseInt(req.getParameter("cdModulo"));
                if(id > 0)
                    dadoPrimario.setCdModulo(id);
            }
            catch (NumberFormatException e) {               
            }
        }
        else
            mensagem = "Módulo obrigatório.<br/>";

        try {
            dadoPrimario.setCdIndicador(Integer.parseInt(req.getParameter("idIndicador")));
            indicador = new IndicadorDAO().consultarPorId(dadoPrimario.getCdIndicador());
        }
        catch (NumberFormatException e) {             
        }
        
        dadoPrimario.setNoDadoPrimario(req.getParameter("noDadoPrimario").trim());
        dadoPrimario.setDsDadoPrimario(req.getParameter("dsDadoPrimario").trim());
        dadoPrimario.setDsUnidadeMedidaDadoPrimario(req.getParameter("dsUnidadeMedidaDadoPrimario").trim());
        
        try {
            new DadoPrimarioBO().validaDadoPrimario(dadoPrimario);
        }
        catch(NegocioException e) {
            mensagem = mensagem + e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = mensagem + e.getMessage();
        }
        
        if(mensagem.equals("")) { 
            try {
                Transacao.iniciar();
                
                new DadoPrimarioDAO().inserir(dadoPrimario);
          
                Transacao.efetivar();
                
                mensagem = "Dado primário incluído com sucesso.";                
            } catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na inclusão do dado primário: " + ex.getMessage();
            }
        }
        
        this.message = mensagem;
    }

    /**
     * Alterar um dado primário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = "";
        int id;

        dadoPrimario = new DadoPrimarioVO();
        
        if(!req.getParameter("cdModulo").equals("")) {
            try {
                id = Integer.parseInt(req.getParameter("cdModulo"));
                if(id > 0)
                    dadoPrimario.setCdModulo(id);
            }
            catch (NumberFormatException e) {   
                mensagem = "Módulo obrigatório";
            }
        }
        
        try {
            dadoPrimario.setCdIndicador(Integer.parseInt(req.getParameter("idIndicador")));
            indicador = new IndicadorDAO().consultarPorId(dadoPrimario.getIdDadoPrimario());
        }
        catch (NumberFormatException e) {             
        }
        
        try {
            dadoPrimario.setIdDadoPrimario(Integer.parseInt(req.getParameter("idDadoPrimario")));
        }
        catch (NumberFormatException e) {
        }
     
        dadoPrimario.setNoDadoPrimario(req.getParameter("noDadoPrimario").trim());
        dadoPrimario.setDsDadoPrimario(req.getParameter("dsDadoPrimario").trim());
        dadoPrimario.setDsUnidadeMedidaDadoPrimario(req.getParameter("dsUnidadeMedidaDadoPrimario").trim());
        
        try {
            new DadoPrimarioBO().validaDadoPrimario(dadoPrimario);
        }
        catch(NegocioException e) {
            mensagem = mensagem + e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = mensagem + e.getMessage();
        }

        if(mensagem.equals("")) {    
            try {
                new DadoPrimarioBO().validaAlteracao(dadoPrimario);
                Transacao.iniciar();
                
                new DadoPrimarioDAO().alterar(dadoPrimario);
         
                Transacao.efetivar();
                
                mensagem = "Dado primário alterado com sucesso.";   
            }
            catch (NegocioException ex) { 
                mensagem = ex.getMessage();
            } 
            catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na alteração do dado primário: " + ex.getMessage();
            }
        }
         
        this.message = mensagem;
    }

    /**
     * Excluir um dado primário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluir(HttpServletRequest req, HttpServletResponse resp) {        
        String mensagem = null;
                
        dadoPrimario = new DadoPrimarioVO();
        
        try {
            dadoPrimario = new DadoPrimarioDAO().consultarPorId(Integer.parseInt(req.getParameter("idDadoPrimario")));
            indicador = dadoPrimario.getIndicador();
        }
        catch (NumberFormatException e) {
            mensagem = "ID do dadoPrimario inválido";
        }
        
        if(mensagem == null) {
            try {
                new DadoPrimarioBO().validaExclusao(dadoPrimario);
                Transacao.iniciar();
                
                new DadoPrimarioDAO().excluir(dadoPrimario);
                
                Transacao.efetivar();
                mensagem = "Dado primário excluído com sucesso.";
            }            
            catch (NegocioException ex) {
                mensagem = "Problema na exclusão do dado primário: " + ex.getMessage();
            }
            catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na exclusão do primário: " + ex.getMessage();
            }
        }
        
        this.dadoPrimario = null;
        
        this.message = mensagem;
    }
    
    /**
     * Confirmar a exclusão do indicador.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void confirmar(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null; 

        dadoPrimario = new DadoPrimarioVO();
        
        try {
            dadoPrimario = new DadoPrimarioDAO().consultarPorId(Integer.parseInt(req.getParameter("idDadoPrimario")));
            indicador = dadoPrimario.getIndicador();
        }
        catch(NumberFormatException e) {
            dadoPrimario = null;
            mensagem = "ID do dado primário desconhecido";
        }
        
        if(dadoPrimario != null) {
            try {
                new DadoPrimarioBO().validaExclusao(dadoPrimario);               
            }
            catch (NegocioException ex) {
                mensagem = ex.getMessage();
                dadoPrimario = null;
            }
            catch (Exception ex) {
                mensagem = "Problemas na excludão do dado primário: " + ex.getMessage();
                dadoPrimario = null;
            }
            
            if(mensagem == null) {
                dadoPrimario.setNoDadoPrimario(req.getParameter("noDadoPrimario"));
                dadoPrimario.setDsDadoPrimario(req.getParameter("dsDadoPrimario"));
            }
            
            this.message = mensagem;
        }
    }

    /**
     * Retorna uma lista de indicadores a partir de parâmetros da tela
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarDadosPrimarios(HttpServletRequest req, HttpServletResponse resp) {
        String nome = req.getParameter("noDadoPrimario");
        Integer idIndicador = null;
        
        try { 
            idIndicador = new Integer(req.getParameter("idIndicador"));
        }
        catch (NumberFormatException e) {
        }
        
        if(nome != null) {
            TabelaHtml tabela = new TabelaHtml();
            
            tabela.setCampoRetorno("idDadoPrimario");
            
            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(60);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
                       
            tabela.gravarCampos();
            
            // Lista de indicadores
            DadoPrimarioVO exemplo = new DadoPrimarioVO();
            if(idIndicador != null && new IndicadorDAO().consultarPorId(idIndicador) != null) {
                if(!nome.isEmpty())
                    exemplo.setNoDadoPrimario(nome);            
                exemplo.setCdIndicador(idIndicador);
                List<DadoPrimarioVO> dados = new DadoPrimarioDAO().consultarPorExemplo(exemplo);
                       
                // Adiciona os valores de cada indicador nas listas de ids e nomes
                for(int i = 0; i < dados.size(); i++) {
                    tabela.adicionarRegistro(converterVoParaString(dados.get(i)));
                }
            }
            return tabela;
        }
        
        return null;
    }
    
    /**
     * Transforma os campos de um VO em uma lista de Strings
     * 
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterVoParaString(DadoPrimarioVO dadoPrimario) {
        List<String> valores = new ArrayList<String>();
        
        valores.add(dadoPrimario.getIdDadoPrimario().toString());
        valores.add(dadoPrimario.getNoDadoPrimario());
        
        return valores;
    }
}